//巴什博弈
//bash_game.cpp

//A和B两人轮流从一堆物品中取出一些物品
//每次取的物品数被限定在范围[1, m]中，至少取1个，最后把物品取光的人获胜

//巴什博弈还可以描述为：A和B两人轮流向一个篮子中放一个范围数量的物品，至少放1个
//最后一个使篮子中物品数量到达一定数量的人获胜
//最后物品的数量和描述1中的起始时的物品数量相同，即只是放和取的过程相反
//本章中其他的博弈问题都可以像这样相反的进行加过程，为了方便不再考虑这种加的描述情况
//
//m和n都是正整数
//1)若n <= m，A一次就可以把这些物品全部取光，则A获胜
//2)若n = m + 1，A可取1到m个物品，剩下的物品数范围是[1, m]
//下一次B总能一次取光，则B获胜
//3)将2)中的1进行推广可以得到若n = (m+1)r + s
//A第一次取s个物品，使得剩(m+1)r个物品，其中1 <= s <= m+1
//下一次B取[1, m]个物品，总是剩下[1 + (m+1)(r-1), m + (m+1)(r-1)]个物品
//则再下一次A可以仍然取一个数字s'使得剩下(m+1)(r-1)个物品
//即B无论如何取，A取后总可以保证剩下m+1的倍数的物品数
//则最后B必然面对在m+1个物品中取一个物品，无论如何取都会剩[1, m]个物品，A必获胜
//相应的若A面对的是(m+1)r个物品，则直接认输
//
//本文引用了“博弈问题”，作者“ZS_918”

#include "general_head.h"

bool bash_game(int n, int m, int& get)
{//剩余n个物品，可取物品数范围为[1, m]
 //判断是否有胜算，若有胜算则返回取的物品数get
	int s = n % (m + 1);
	if(s){
		get = s;
		return(true);
	}
	else
		return(false);
}
